/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projet_compressionimage;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 *
 * @author Colin
 */
public class CompressionImage {

    /**
     * @param args the command line arguments
     */
    public static int MAX_DISTANCE_COULEUR=441;
    public static void main(String[] args) {
        
            BufferedImage image=null;
            BufferedImage imageModifie=null;
            ArbreQuadratique arbre=null;
            
            int nbCompressions=0;
            float pourcToleranceCouleurs=0;
            int nbdivisionsResolution=0;
            int nb_choisit=0;
           do {
            System.out.println("******* Menu *******");
            System.out.println("1- Ouvrir une image");
            System.out.println("2- Modifier l'image");
            System.out.println("3- Afficher l'arbre");
            System.out.println("4- enregistrer l'image");
            System.out.println("5- Fermer");
            
            nb_choisit = Lire.i();
            switch (nb_choisit) {
                case 1:
                    try {
                        image = ouvrir();
                    } catch (FileNotFoundException ex) {
                        System.out.println("Le fichier n'a pas été trouvé");
                    } catch (IOException ex) {
                        System.out.println("Une erreur s'est produite durant l'ouverture");
                    }
                    break;
                case 2:
                    if(image!=null){
                        System.out.println("Compression de l'arbre:");
                        System.out.println("\t Saisir le nombre de compressions ");
                        System.out.println("\t\t 1: Réduit jusqu'a 4 pixel de couleurs en 1 couleur");
                        System.out.println("\t\t 2: Réduit jusqu'a 16 pixel de couleurs en 1 couleur");
                        
                        nbCompressions = Lire.i();
                        System.out.println("\t Pourcentage de distance toléré pour la compression des couleurs ");
                        pourcToleranceCouleurs = Lire.i();
                        
                        System.out.println("\t Diviser n fois par 2 la résolution de l'image (1,2,3...)  ");
                        nbdivisionsResolution = Lire.i();
                        
                        if(image.getWidth()<2048||image.getHeight()<2048){
                        arbre = TransformerEnArbre(image);
                        arbre= CompresserArbre(arbre,nbCompressions, nbdivisionsResolution,(int)((pourcToleranceCouleurs/100)*MAX_DISTANCE_COULEUR));
                        arbre= DiviserResolutionArbre(arbre, nbdivisionsResolution);
                        }else{
                            System.out.println("Cette image est très grande: toutes les modification seront réalisée au moment de l'enregistrement de l'image");
                        }
                    }else
                    {
                        System.out.println("Vous devez commencer par ouvrir une image");
                    }
                    break;
                case 3:
                    System.out.println("Affichage de l'arbre quadratique");
                    System.out.println(arbre);
                    break;
                case 4:
                    if(image.getWidth()>2048||image.getHeight()>2048){
                        int size2n=ArbreQuadratique.foundSize2n(image);
                        BufferedImage image2n= new BufferedImage(size2n, size2n, image.getType());
                        image2n=ArbreQuadratique.copyImageInto(image2n,image);
                        //while(){
                        // découpage le morceau img de image
                        BufferedImage img = image2n.getSubimage(0, 0, 2048, 2048);
                        arbre = TransformerEnArbre(img);
                        arbre=CompresserArbre(arbre,nbCompressions,nbdivisionsResolution,(int)((pourcToleranceCouleurs/100)*MAX_DISTANCE_COULEUR));
                        System.out.println("Fabrication de la nouvelle image");
                        BufferedImage nouvImage=TransformerEnImage(arbre);
                        // recoller l'image au bon endroit dans l'image imageModifie
                        //}
                    }else{
                        if(image!=null && arbre!=null){
                            System.out.println("Fabrication de la nouvelle image");
                            imageModifie=TransformerEnImage(arbre);
                            System.out.println("Enregistrement de la nouvelle image");
                            try {
                                enregistrer(imageModifie);
                            } catch (FileNotFoundException ex) {
                                System.out.println("Le fichier n'a pas été trouvé");
                            } catch (IOException ex) {
                                System.out.println("Une erreur s'est produite durant l'enregistrement");
                            }
                        }else
                        {
                            System.out.println("Avant d'enregistrer vous devez modifier une image");
                        }
                    }
                    break;
                case 5:
                    System.out.println("Fermeture de l'application");
                    break;
            }

        } while (nb_choisit != 5);
         
    }

    

    public static ArbreQuadratique TransformerEnArbre(BufferedImage image) {
        ArbreQuadratique arbre = new ArbreQuadratique(image);
        arbre.quadripartition(image);
        return arbre;
    }

    public static ArbreQuadratique CompresserArbre(ArbreQuadratique arbre, int nbCompressions,int nbdivisionsResolution, int indicateurDiffMaxCouleurs) {
        if(nbdivisionsResolution>=nbCompressions){indicateurDiffMaxCouleurs=MAX_DISTANCE_COULEUR;}
        arbre.compression(Math.max(nbCompressions, nbdivisionsResolution),indicateurDiffMaxCouleurs);
        return arbre;
    }
    public static ArbreQuadratique DiviserResolutionArbre(ArbreQuadratique arbre, int nbDivisions) {
        arbre.diviserResolution(nbDivisions);
        return arbre;
    }
    

    public static BufferedImage TransformerEnImage(ArbreQuadratique arbre) {
        return arbre.reconstitutionImage();
    }

    private static BufferedImage ouvrir() throws FileNotFoundException, IOException {
        System.out.println("Saisissez le chemin (path) pour acceder à l'image sur le disque");
        String imagePath = Lire.S();
        FileInputStream fileStream = new FileInputStream(imagePath);
        BufferedImage image = ImageIO.read(fileStream);
        fileStream.close();
        return image;
    }

    private static void enregistrer(BufferedImage imageModifie) throws FileNotFoundException, IOException {
        System.out.println("Saisissez le nom du fichier dans lequel vous souhaitez enregistrer");
        String imagePath = Lire.S();
        System.out.println("Format de l'image: (jpg, gif, png)");
        String imageFormat = Lire.S();
        FileOutputStream outPutFileImage = new FileOutputStream(imagePath);
        ImageIO.write(imageModifie, imageFormat, outPutFileImage);
        outPutFileImage.close();
    }
}
